#include "command.h"
int handler_puts(int sockfd, data msg, char *wk_path){
    // 判断本地是否存在该文件
    char cwd_buf[1024] = {0};
    char *p = "/";
    char *file_path = getcwd(cwd_buf, sizeof(cwd_buf));
    strcat(file_path, p);
    strcat(file_path, msg.args);
    if (access(file_path, F_OK) == -1){
        printf("文件不存在!\n");
        return 0;
    }
    //到此说明本地存在该文件
    //发送文件名
    send(sockfd, &msg, sizeof(data), MSG_NOSIGNAL);
    //发送服务端工作路径
    send(sockfd, wk_path, 1024, MSG_NOSIGNAL);
    //计算并发送文件哈希值
    char *hash;
    compute_sha256_hash(file_path, &hash);
    send(sockfd, hash, 512, MSG_NOSIGNAL);
    //接收服务端返回的信息判断文件是否以及存在于服务器中
    int flag = 0; //0表示需要上传，1表示不需要上传
    recv(sockfd, &flag, sizeof(int), MSG_WAITALL);
    if(flag == 1){
        printf("文件上传完成!\n");
        return 0;
    }
    //开始上传文件
    //打开文件
    int file_fd = open(file_path, O_RDWR);

    //计算服务端文件的总大小
    struct stat size;
    fstat(file_fd, &size);
    //printf("打开的文件大小 = %ld\n", size.st_size);
    //接收客户端下载文件存在的大小
    off_t cilent_size;
    recv(sockfd, &cilent_size, sizeof(off_t), MSG_WAITALL);
    //发送总文件的大小
    send(sockfd, &size.st_size, sizeof(off_t), MSG_NOSIGNAL);
    //计算需要发送的文件大小
    off_t send_size = size.st_size - cilent_size;
    //发送文件
    
    sendfile(sockfd, file_fd, &cilent_size, send_size);
    printf("文件发送完成\n");
    close(file_fd);
    //log_log("INFO","SERVE","文件下载成功");
    return 0;
}